﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>		//system的头文件
#include <stdbool.h>		//false
#include <stdlib.h>			//malloc
#include <time.h>			//srand time

#define WALL L'■'			//墙、蛇身、食物
#define BODY L'●'
#define FOOD L'★'

#define POS_X 24			//蛇头初始坐标
#define POS_Y 5

#define KEY_PRESS(vk)  ((GetAsyncKeyState(vk)&1)?1:0)	//按键下，则返回1
//蛇和食物的参数（坐标和身体）
typedef struct SnakeNode
{
	int x;		//坐标(数据域)
	int y;
	struct SnakeNode* next;		//（指针域）
}SnakeNode,* pSnakeNode;
//管理整条贪吃蛇
typedef struct Snake
{
	pSnakeNode _pSnake;		//维护整条蛇的指针
	pSnakeNode _pFood;		//维护食物的指针
	enum DIRECTION _Dir;	//蛇头的方向（默认向右）
	enum GAME_STATUS _Status;	//游戏状态
	int _Sorce;				//得分
	int _FoodWeight;		//默认每个食物10分
	int _SleepTime;			//每走一步休眠时间(时间短，速度就快)
}Snake,* pSnake;

//方向（枚举）
enum DIRECTION
{
	UP=1,		//上下左右
	DOWN,
	LEFT,
	RIGHT
};
//游戏状态
enum GAME_STATUS
{
	OK,				//正常运行
	KILL_BY_WALL,	//撞墙
	KILL_BY_SELF,	//吃到自己
	END_NOMAL		//正常退出
};
//光标定位
void SetPos(int x, int y);
//////////////////////////
//		游戏开始
//////////////////////////
//游戏开始（贪吃蛇初始化）
void GameStart(pSnake ps);
//打印欢迎界面
void WelcomeToGame();
//打印地图
void CreateMap();
//初始化蛇
void InitSnake(pSnake ps);
//创造第一个食物
void CreateFood(pSnake ps);
//////////////////////////
//		游戏运行
//////////////////////////
//游戏运行
void GameRun(pSnake ps);
//蛇的移动-走一步
void SnakeMove(pSnake ps);
//下一个位置是否是食物
int NextIsFood(pSnakeNode psn,pSnake ps);
//吃掉食物
void EatFood(pSnakeNode psn,pSnake ps);
//没有食物
void NoFood(pSnakeNode psn, pSnake ps);
//撞墙
void KillByWall(pSnake ps);
//吃到自己
void KillBySelf(pSnake ps);
//游戏结束
void GameEnd(pSnake ps);